package com.aleyn.annotation

/**
 * @author: Aleyn
 * @date: 2023/7/28 11:28
 * @desc: 依赖注入限定符注解。
 *
 * 在依赖注入（DI）场景中，当一个接口有多个不同的实现类时，DI 容器无法确定应该注入哪一个。
 * `@Qualifier` 注解就是为了解决这个问题而设计的。它通过一个唯一的字符串标识符来区分这些实现，
 * 从而允许你精确地指定需要注入哪一个具体实例。
 *
 * 此注解可以用于：
 * 1. **标记实现类**：在 `@Singleton` 或 `@Factory` 注解的类上使用，为其提供一个唯一的名称。
 * 2. **标记注入点**：在构造函数的参数上使用，指定需要注入的、具有特定限定符的实例。
 *
 * 使用示例：
 * ```kotlin
 * // 1. 定义一个通用接口
 * interface Storage {
 *     fun save(data: String)
 * }
 *
 * // 2. 提供两个不同的实现，并使用 @Qualifier 进行区分
 * @Qualifier("DiskCache")
 * @Singleton
 * class DiskStorage : Storage { ... }
 *
 * @Qualifier("MemoryCache")
 * @Singleton
 * class MemoryStorage : Storage { ... }
 *
 * // 3. 在需要注入的地方，使用 @Qualifier 指定具体的实现
 * @Factory
 * class DataRepository(
 *     @Qualifier("DiskCache") private val diskStorage: Storage, // 注入 DiskStorage 实例
 *     @Qualifier("MemoryCache") private val memoryStorage: Storage // 注入 MemoryStorage 实例
 * ) { ... }
 * ```
 *
 * @param value 用于唯一标识一个实现的字符串。这个值必须是唯一的，以便 DI 容器能够准确查找。
 */
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS, AnnotationTarget.VALUE_PARAMETER)
annotation class Qualifier(val value: String)
